﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AjaxControlToolkit;
using Recursos.Model;
using System.Drawing;
using System.Web.Security;

namespace Recursos.View
{
    public partial class RservacionView : System.Web.UI.Page
    {
        int tabactual = 0;

        protected void Page_Load(object sender, EventArgs e)
        {

            Label1.BackColor = Color.Gray;
            Label4.BackColor = Color.DarkGray;
            Label6.BackColor = Color.FromArgb(0x8BB381);

            var userSecurity = ((Usuario)Session["UserLogged"]);
            if (userSecurity == null)
                Response.Redirect("~/NoAccess.aspx");
            var permisos = new PermisosModel();
            if (permisos.obtenerRolUsuario(userSecurity.Cedula).Equals("Operador"))
               Response.Redirect("~/NoAccess.aspx");
            
            
            var user = permisos.obtenerRolUsuario(userSecurity.Cedula);
            if (!Page.IsPostBack && userSecurity != null &&
                (user.Equals("Administrador") || user.Equals("Coordinador") || user.Equals("Profesor")))
            {
                txtaño.Text = System.DateTime.Now.Year.ToString();
                PopulateDropDown();
                btnreservar.Enabled = true;
            }


            else if (userSecurity == null || user.Equals("Operador"))
            {
                Response.Redirect("~/NoAccess.aspx");
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                int.Parse(txtaño.Text);
                txtaño.Enabled = true;

                llenargrid();

                btnreservar.Enabled = true;
            }
            catch (Exception)
            {
                WebMsgBox.Show("Indique el año", "Reservaciones");
            }
            
        }

        private void PopulateDropDown()
        {

            CargarSedes();
            CargarModalidad();
            CargarGrupo(int.Parse(DropDownListSedes.SelectedValue));
            CargarProfesor();

        }

        private void CargarSedes()
        {
            var sede = new SedeModel();
            DropDownListSedes.DataSource = sede.CargarSedes();
            DropDownListSedes.DataTextField = "Nombre";
            DropDownListSedes.DataValueField = "id";
            DropDownListSedes.DataBind();
        }
        private void CargarModalidad()
        {
            var modalidad = new ModalidadModel();
            DropDownListModalidad.DataSource = modalidad.CargarModalidad();
            DropDownListModalidad.DataTextField = "Nombre";
            DropDownListModalidad.DataValueField = "id";
            DropDownListModalidad.DataBind();
        }
        private void CargarProfesor()
        {
            var usuario = new UsuarioModel();
            DropDownListProfesor.DataSource = usuario.CargarProfesor();
            DropDownListProfesor.DataTextField = "Nombre";
            DropDownListProfesor.DataValueField = "id";
            DropDownListProfesor.DataBind();
        }

        private void CargarGrupo(int idsede)
        {
            DropDownListCurso.Items.Clear();
            var periodos1 = new PeriodoModel();
            try
            {
             
                var period = periodos1.RetornarPeriodo(int.Parse(txtaño.Text.ToString()), int.Parse(DropDownListPeriodo.SelectedValue), int.Parse(DropDownListModalidad.SelectedValue));
                if (period == 0)
                {
                    
                    return;
                }
            }
            catch (Exception)
            {
                WebMsgBox.Show("Seleccione un periodo válido", "Reservaciones");

            }
            var userSecurity = ((Usuario)Session["UserLogged"]);
            var grupo = new GrupoModel();
            var grupo2 = grupo.CargarGupo(idsede);
            int periodo=periodos1.RetornarPeriodo(int.Parse(txtaño.Text.ToString()), int.Parse(DropDownListPeriodo.SelectedValue),int.Parse(DropDownListModalidad.SelectedValue));
            DropDownListCurso.DataSource = grupo.CargarGupoReservaciones(idsede, periodo, userSecurity.Carrera.id);
            DropDownListCurso.DataTextField = ("Codigo");
            DropDownListCurso.DataValueField = "id";
            DropDownListCurso.DataBind();

        }

        private void llenargrid()
        {
            var espaciomodel = new EspacioModel();
            var reservacionmodel = new RservacionModel();
            int identificador = 0;
            var periodomodel = new PeriodoModel();
            var periodo = periodomodel.RetornarPeriodo(int.Parse(txtaño.Text), int.Parse(DropDownListPeriodo.SelectedValue), int.Parse(DropDownListModalidad.SelectedValue));
            if (periodo == 0)
            {

                WebMsgBox.Show("Seleccione un periodo válido", "Reservaciones");
                return;
            }
            var fechainicio = periodomodel.CargarPorId(periodo).FechaInicio;
            var fechafinal = periodomodel.CargarPorId(periodo).FechaFinal;
            var espaciossede = espaciomodel.ObtenerEspaciosSede(int.Parse(DropDownListSedes.SelectedValue));
            foreach (var espacio in espaciossede)
            {
                Control tabContent = new Control();
                tabContent.ID = "tabcontent" + Convert.ToString(identificador);
                TabPanel tab = new TabPanel();
                tab.ID = "tabPanel1" + Convert.ToString(identificador);

                tab.HeaderText = espacio.Codigo;
                Table tabla = new Table { CellSpacing = 5, HorizontalAlign = HorizontalAlign.Center };

                #region llenarencabezadogrid
                TableRow r1 = new TableRow { Height = 25 };

                var tc1 = new TableCell { Text = "Hora", BackColor = Color.FromArgb(0x336699), ForeColor = Color.White, HorizontalAlign = HorizontalAlign.Center };
                r1.Cells.Add(tc1);

                var tc2 = new TableCell { Text = "Lunes", BackColor = Color.FromArgb(0x336699), ForeColor = Color.White, HorizontalAlign = HorizontalAlign.Center };

                r1.Cells.Add(tc2);


                var tc3 = new TableCell { Text = "Martes", BackColor = Color.FromArgb(0x336699), ForeColor = Color.White, HorizontalAlign = HorizontalAlign.Center };

                r1.Cells.Add(tc3);

                var tc4 = new TableCell { Text = "Miércoles", BackColor = Color.FromArgb(0x336699), ForeColor = Color.White, HorizontalAlign = HorizontalAlign.Center };

                r1.Cells.Add(tc4);


                var tc5 = new TableCell { Text = "Jueves", BackColor = Color.FromArgb(0x336699), ForeColor = Color.White, HorizontalAlign = HorizontalAlign.Center };

                r1.Cells.Add(tc5);

                var tc6 = new TableCell { Text = "Viernes", BackColor = Color.FromArgb(0x336699), ForeColor = Color.White, HorizontalAlign = HorizontalAlign.Center };

                r1.Cells.Add(tc6);

                var tc7 = new TableCell { Text = "Sábado", BackColor = Color.FromArgb(0x336699), ForeColor = Color.White, HorizontalAlign = HorizontalAlign.Center };

                r1.Cells.Add(tc7);

                tabla.Rows.Add(r1);

                TableRow r2 = new TableRow { Height = 25 };
                r2.Cells.Add(new TableCell { Text = "07:30", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r2);
                tabla.Rows.Add(r2);

                TableRow r3 = new TableRow { Height = 25 };
                r3.Cells.Add(new TableCell { Text = "08:30", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r3);
                tabla.Rows.Add(r3);

                TableRow r4 = new TableRow { Height = 25 };
                r4.Cells.Add(new TableCell { Text = "09:30", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r4);
                tabla.Rows.Add(r4);

                TableRow r5 = new TableRow { Height = 25 };
                r5.Cells.Add(new TableCell { Text = "10:30", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r5);
                tabla.Rows.Add(r5);

                TableRow r6 = new TableRow { Height = 25 };
                r6.Cells.Add(new TableCell { Text = "11:30", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r6);
                tabla.Rows.Add(r6);

                TableRow r7 = new TableRow { Height = 25 };
                r7.Cells.Add(new TableCell { Text = "13:00", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r7);
                tabla.Rows.Add(r7);

                TableRow r8 = new TableRow { Height = 25 };
                r8.Cells.Add(new TableCell { Text = "14:00", Width = 75, HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r8);
                tabla.Rows.Add(r8);

                TableRow r9 = new TableRow { Height = 25 };
                r9.Cells.Add(new TableCell { Text = "15:00", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r9);
                tabla.Rows.Add(r9);

                TableRow r10 = new TableRow { Height = 25 };
                r10.Cells.Add(new TableCell { Text = "16:00", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r10);
                tabla.Rows.Add(r10);

                TableRow r11 = new TableRow { Height = 25 };
                r11.Cells.Add(new TableCell { Text = "17:00", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r11);
                tabla.Rows.Add(r11);

                TableRow r12 = new TableRow { Height = 25 };
                r12.Cells.Add(new TableCell { Text = "18:00", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r12);
                tabla.Rows.Add(r12);

                TableRow r13 = new TableRow { Height = 25 };
                r13.Cells.Add(new TableCell { Text = "19:00", Width = 75, HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r13);
                tabla.Rows.Add(r13);

                TableRow r14 = new TableRow { Height = 25 };
                r14.Cells.Add(new TableCell { Text = "20:00", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r14);
                tabla.Rows.Add(r14);

                TableRow r15 = new TableRow { Height = 25 };
                r15.Cells.Add(new TableCell { Text = "21:00", HorizontalAlign = HorizontalAlign.Center });
                PopulateCells(r15);
                tabla.Rows.Add(r15);
                #endregion

                var reseracionesxespacio = reservacionmodel.CargarReservacionesEspacioNuevo(espacio.id,fechainicio,fechafinal);
                var reservacionesparticularesxespacio = reservacionmodel.CargarReservacionesParticualresEspacioNuevo(espacio.id,fechainicio,fechafinal);
                foreach (var reservacion in reseracionesxespacio)//recorrer las reservaciones del curso
                {
                    int celdainicial = 0;
                    for (int celdaactual = 0; celdaactual < tabla.Rows.Count; celdaactual++)
                    {//encuentra la celda donde se inicia a colorear la reservacion
                        string hora = reservacion.Reservacion.HoraInicio;
                        string celda = tabla.Rows[celdaactual].Cells[0].Text.ToString();
                        if (celda == hora)
                            celdainicial = celdaactual;

                    }
                    string[] dias = reservacion.Reservacion.Dias.ToString().Split('-');
                    pintarGrid(dias, celdainicial, tabla, int.Parse(reservacion.Reservacion.Bloques.ToString()),0);
                }

                foreach (var reservacion in reservacionesparticularesxespacio)//recorrer las reservaciones del curso
                {
                    int celdainicial = 0;
                    for (int celdaactual = celdainicial; celdaactual < tabla.Rows.Count; celdaactual++)
                    {//encuentra la celda donde se inicia a colorear la reservacion
                        string hora = reservacion.Reservacion.HoraInicio;
                        string celda = tabla.Rows[celdaactual].Cells[0].ToString();
                        if (celda == hora)
                            celdainicial = celdaactual;

                    }
                    string[] dias = reservacion.Reservacion.Dias.ToString().Split('-');
                    pintarGrid(dias, celdainicial + 1, tabla, int.Parse(reservacion.Reservacion.Bloques.ToString()),1);
                }
                identificador++;
                tabContent.Controls.Add(tabla);
                tab.Controls.Add(tabContent);
                TabContainer1.Tabs.Add(tab);
            }
        }

        private void PopulateCells(TableRow row)
        {
            row.Cells.Add(new TableCell { BackColor = Color.FromArgb(0x8BB381), Width = 85, HorizontalAlign = HorizontalAlign.Center });
            row.Cells.Add(new TableCell { BackColor = Color.FromArgb(0x8BB381), Width = 85, HorizontalAlign = HorizontalAlign.Center });
            row.Cells.Add(new TableCell { BackColor = Color.FromArgb(0x8BB381), Width = 85, HorizontalAlign = HorizontalAlign.Center });
            row.Cells.Add(new TableCell { BackColor = Color.FromArgb(0x8BB381), Width = 85, HorizontalAlign = HorizontalAlign.Center });
            row.Cells.Add(new TableCell { BackColor = Color.FromArgb(0x8BB381), Width = 85, HorizontalAlign = HorizontalAlign.Center });
            row.Cells.Add(new TableCell { BackColor = Color.FromArgb(0x8BB381), Width = 85, HorizontalAlign = HorizontalAlign.Center });
        }

        private void pintarGrid(string[] dias, int celdainicial, Table tabla, int bloques,int tipo)
        {
            foreach (var dia in dias)
            { //colores la reservacion
                #region dias2
                int columna = 0;
                if (dia != "" && dia != "-")
                {
                    switch (dia)
                    {
                        case "L":
                            columna = 1;
                            break;
                        case "K":
                            columna = 2;
                            break;
                        case "M":
                            columna = 3;
                            break;
                        case "J":
                            columna = 4;
                            break;
                        case "V":
                            columna = 5;
                            break;
                        case "S":
                            columna = 6;
                            break;
                    }
                    if (celdainicial == 0)
                        celdainicial = 1;
                    for (int iterador = 0; iterador < bloques; iterador++)
                    {
                        if (tipo == 0)
                        {
                            tabla.Rows[celdainicial + iterador].Cells[columna].BackColor = Color.Gray;
                        }
                        if (tipo == 1)
                        {
                            tabla.Rows[celdainicial + iterador].Cells[columna].BackColor = Color.DarkGray;
                        }

                    }

                }
            }
                #endregion
        }

        protected void Reservar(Object sender, EventArgs e)
        {
            if (DropDownListSedes.SelectedValue == "")
                return;
            string[] hinicio = DropDownListHoraInicio.SelectedValue.ToString().Split(':');
            string[] hfinal = DropDownListHoraFinal.SelectedValue.ToString().Split(':');
            int intinicio = int.Parse(hinicio[0] + hinicio[1]);
            int intfinal = int.Parse(hfinal[0] + hfinal[1]);

            if (intfinal < intinicio)
            {
                lblhoras.Visible = true;
                llenargrid();
            }
            else
            {


                lblhoras.Visible = false;
                string dias = "";
                if (cblunes.Checked == true)
                    dias += "L-";
                if (cbmartes.Checked == true)
                    dias += "K-";
                if (cbmiercoles.Checked == true)
                    dias += "M-";
                if (cbjueves.Checked == true)
                    dias += "J-";
                if (cbviernes.Checked == true)
                    dias += "V-";
                if (cbsabado.Checked == true)
                    dias += "S-";
                if (dias.Length == 0)
                {
                    WebMsgBox.Show("Seleccione los dias para la reservación", "Reservaciones");
                    llenargrid();
                    return;
                }

                string dia = dias.Remove(dias.Length - 1, 1);
                llenargrid();
                if (TabContainer1.Tabs.Count == 0)
                {
                    WebMsgBox.Show("Seleccione un espacio para la reservación", "Reservaciones");
                    return;
                }
                    
                string tab = obtenarTab();

                bool estado = false;

                if (txtaño.Text == "" || TabContainer1.Tabs.Count == 0)
                {
                    llenargrid();
                    WebMsgBox.Show("Complete los datos para la reservación periódica", "Reservaciones");
                    
                }
                else
                {
                    estado = generarReservacion(tab, dia);
                    if (estado == true)
                    {
                        btnreservar.Enabled = false;
                        WebMsgBox.Show("Reservacion creada correctamente", "Reservaciones");
                        CleanTextBox();
                        
                        
                    }
                    else
                    {
                        btnreservar.Enabled = false;
                        WebMsgBox.Show("No se creo la reservación debido a choque de horarios o periodo inexistente", "Reservaciones");
                        
                        
                    }
                }
            }

              
            
        }

        private void CleanTextBox()
        {
            txtaño.Text = "";
        }

        private string obtenarTab()
        {
            llenargrid();
            int actual = TabContainer1.ActiveTabIndex;
            string tab = TabContainer1.Tabs[actual].HeaderText.ToString();
            return tab;
        }

        private bool generarReservacion(string tab, string dias)
        {
            
            var userSecurity = ((Usuario)Session["UserLogged"]);
            int cedula = userSecurity.Cedula;
            var reservacion = new RservacionModel();
           
            bool efectuada = reservacion.CrearReservacion(DropDownListHoraInicio.Text, DropDownListHoraFinal.Text, tab, int.Parse(DropDownListCurso.SelectedValue), System.DateTime.Today, dias, int.Parse(DropDownListPeriodo.SelectedValue), int
             .Parse(DropDownListModalidad.SelectedValue), int.Parse(txtaño.Text), int.Parse(DropDownListProfesor.SelectedValue),cedula);
            return efectuada;
        }

        protected void TabContainer1_ActiveTabChanged(object sender, EventArgs e)
        {
            tabactual = TabContainer1.TabIndex;
        }

        protected void DropDownListSedes_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarGrupo(int.Parse(DropDownListSedes.SelectedValue));
            llenargrid();
        }

        protected void DropDownListModalidad_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarGrupo(int.Parse(DropDownListSedes.SelectedValue));
            llenargrid();
        }

        protected void DropDownListPeriodo_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarGrupo(int.Parse(DropDownListSedes.SelectedValue));
            llenargrid();
        }

        protected void txtaño_TextChanged(object sender, EventArgs e)
        {
            CargarGrupo(int.Parse(DropDownListSedes.SelectedValue));
            llenargrid();
        }
    }
}